/****************************************************************************
**
** Copyright (C) 2011 Jesús Martínez Pérez
**
** This program is free software: you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the 
** Free Software Foundation, either version 3 of the License, or (at your
** option) any later version.
**
** This program is distributed in the hope that it will be useful, but 
** WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
** or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
** for more details.
**
** You should have received a copy of the GNU General Public License along 
** with this program. If not, see <http://www.gnu.org/licenses/>
**
****************************************************************************/
/*
 * vbits.h
 *
 *		Created on: 22/05/2010
 *		Author: Jesús Martínez Pérez
 */
#ifndef _VBITS_H_
#define _VBITS_H_
#define MAX 10
#include <vd_unsignedchar.h> 
#include <iostream>
/**
 * \class Vbits
 *
 *
 * \brief Esta clase hace posible el uso de un vector de bits que está formado
 			 por un vector dinámico de unsigned char (VD_unsignedchar)
 *         
 *
 * \author Jesús Martínez Pérez 
 *
 *
 * \date $Date: 22/05/2010 $
 *
 */
using namespace std;
class Vbits{
	private:
		VD_unsignedchar vd;
		unsigned long int n;
	public:
/**
@brief Constructor por defecto
*/
		Vbits();
/**
@brief Constructor por parámetros
@param[in] tam El tamaño del vector de bits que queremos crear
*/
		Vbits(int tam);
/**
@brief Constructor por parámetros
@param[in] vd1 El vector dinámico de unsigned char que va a crear el vector de bits
*/
		Vbits(VD_unsignedchar vd1);
/**
@brief Construye un vector de bits que representa en binario el primer parámetro en el número de bits que indique el segundo parámetro.
@param[in] n El número que se va a representar en binario
@param[in] bits El tamaño del vector de bits que se va a crear
*/
		Vbits(int n,int bits);		
/**
@brief Consultar el número de elemenos que tiene el vector dinámico de char que contiene el vector de bits
@return Un valor entero que indica el numero de elementos que tiene el vector dinámico de char que contiene el vector de bits
*/
		int tamV();
/**
@brief Consultar el valor al que pertenece una posición en el vector
@param[in] pos La posición que queremos consultar
@return El valor unsigned char que tiene el vector de bits en la posición indicada
*/
		unsigned char Getv(int pos)const;
/**
@brief Consultar el número de elemenos que tiene el vector de bits
@return Un valor unsigned long int que indica el numero de elementos que tiene el vector de bits
*/
		unsigned long int Size()const;
/**
@brief Invierte en posiciones el contenido del vector de bits 
*/
		void Invertir();
/**
@brief Añade ceros al vector de bits hasta que se complete el bit, que es cuando
		 el número de elemenos sea múltiplo de 8
*/
		void Completar();
/**
@brief Añadir un valor booleano al final del vector de bits
@param[in] bit El valor booleano que queremos añadir al vector de bits
*/
		void Add(bool bit);
/**
@brief Consultar el valor al que pertenece una posición en el vector
@param[in] i La posición que queremos consultar
@return El valor booleano en el vector que tiene la posición indicada
*/
		bool Get(int i)const;
/**
@brief Modificar el valor del booleano que pertenece a una posición en el vector
@param[in] b El valor que queremos asignar a esa posición
@param[in] i La posición que queremos modificar
*/
		void Set(bool b,int i);
/** 
@brief Añade un valor booleano al final de un vector de bits que tenemos
*/
		Vbits &operator+=(const bool b);
/** 
@brief Sobrecarga del operador de asignación sobre un vector de bits
*/
		Vbits &operator=(const Vbits &v);
/** 
@brief Concatena un vector de bits al final de un vector de bits que tenemos
@param[in] v El vector de bits que queremos añadir
*/
		Vbits &operator+=(const Vbits & v);
/** 
@brief Sobrecarga del operador de igualdad de vector de bits
@return True si son iguales, False en caso contrario
*/
		bool operator==(const Vbits &v);
/** 
@brief Sobrecarga del operador de desigualdad
@return True si son distintos, False en caso contrario
*/
		bool operator!=(const Vbits &v);
/** 
@brief Sobrecarga del operador de salida
*/
		friend ostream & operator<<(ostream & os, const Vbits &v);
/** 
@brief Sobrecarga del operador de entrada
*/
		friend istream & operator>>(istream & is,Vbits & v);
};
#endif
